package com.javasm.springmybatis.timer;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @Author：longjinyi
 * @Version：1.0
 * @Date：2021/12/30-7:38
 * @Since:jdk1.8
 * @Description:
 */
//定时任务
//实现方式：2种
//第一种
//1：JDK自带的 Timer
public class TimerTest {
    public static void main(String[] args) {

//        //创建定时的timer对象
//        Timer timer = new Timer();
//
//        TimerTask timerTask = new TimerTask() {
//            @Override
//            public void run() {
//
//                //Timer没有线程池
//                String name = Thread.currentThread().getName();
//                System.out.println("thread name======"+name);
//                System.out.println("timer  execute.....");
//            }
//        };
//
//
//        //timerTask 执行的任务
//        // delay:延迟时间  单位是毫秒
//        // period:执行任务的间隔时间  单位是毫秒
//        timer.schedule(timerTask, 2000, 3000);
//
//        //代码在执行的时候，如果没有设置睡眠时间，代码刷的就执行完了，还没来得及去执行任务、延迟时间、间隔时间，
//        //即控制台都没有打印，代码就执行完了
//        //为了让它能执行任务，这里要设置睡眠时间
//        try {
//            TimeUnit.SECONDS.sleep(35);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//
//
//        //任务完成后取消任务
//        timer.cancel();


        //抽取体现Timer没有线程池的方法
        testThreadPool();

        //定时任务指定具体时间打印:
        //缺点:
        //1.没有线程池。
        //2.不能指定固定的时间间隔一直执行这个事。比如说某个月某一天执行
        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("指定具体时间执行任务");
            }
        };

        //指定具体时间
        String time = "2021-12-30 8:32:15";

        //指定时间格式
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parse = null;
        try {
            //将字符串time转成Date类型
            parse = simpleDateFormat.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        //将指定的具体时间传进执行任务的方法schedule
        timer.schedule(timerTask,parse);

        //任务完成后取消任务
        timer.cancel();
    }

    private static void testThreadPool() {
        //通过循环调用，来体现Timer没有线程池
        //控制台打印线程名字的时候，线程名字跟着循环增加，说明没有线程池，因为线程池的线程数量是固定的
        for (int i = 0; i < 100; i++) {
            //创建定时的timer对象
            Timer timer = new Timer();

            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {

                    //Timer没有线程池
                    String name = Thread.currentThread().getName();
                    System.out.println("thread name======"+name);
                    System.out.println("timer  execute.....");
                }
            };


            //timerTask 执行的任务
            // delay:延迟时间  单位是毫秒
            // period:执行任务的间隔时间  单位是毫秒
            timer.schedule(timerTask, 0);

            //任务完成后取消任务
            timer.cancel();
        }
    }
}
